def probC(s):
w = 0
o = 0
tot = 0
i = 1
while i<len(s):
if s[i] == "v":
if s[i-1] == "v":
w += 1
tot += o
elif s[i] == "o":
o += w
i+=1
return tot
s = input()
print(probC(s))
#include<bits/stdc++.h>
//#include<ext/pb_ds/assoc_container.hpp>//
//#include<ext/pb_ds/tree_policy.hpp>//
using namespace std;
//using namespace __gnu_pbds;//
#define int long long int
#define fastio ios_base::sync_with_stdio(false);cin.tie(nullptr); cout.tie(nullptr);
#define endl '\n'
#define fo(i,x,n) for(int i=x; i<=n;i++)
#define rfo(i,n,x) for(int i=n; i>=x;i--)
#define kill(x) cout<<x<<endl;continue;
#define OUTPUT(x) cout << (x ? "YES" : "NO")<<endl;
#define Output(x) cout << (x ? "Yes" : "No")<<endl;
#define output(x) cout << (x ? "yes" : "no")<<endl;
#define minv(v) *min_element(v.begin(), v.end())
#define maxv(v) *max_element(v.begin(), v.end())
#define sumv(v) accumulate(v.begin(), v.end(), 0LL)
#define print(v) for(auto k : v) cout<<k<<" "
#define all(v) v.begin(),v.end()
#define rall(v) v.rbegin(),v.rend()
#define p1(x) cout<<x<<endl
#define p2(x,y) cout<<x<<" "<<y<<endl
#define p3(x,y,z) cout<<x<<" "<<y<<" "<<z<<endl
#define pb push_back
#define ff first
#define ss second
#define ii pair<int,int>
#define vii vector<ii>
#define vi vector<int>
#define vvi vector<vector<int>>
#define mod 1000000007
#define FILL(x,v) memset(x, v, sizeof(x))
#define PI 3.14159265358979323846
#define INF LLONG_MAX //9.223372e+18
//typedef tree<int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update> ordered_set;//
struct custom_hash {
static uint64_t splitmix64(uint64_t x) {
x += 0x9e3779b97f4a7c15;
x = (x ^ (x >> 30)) * 0xbf58476d1ce4e5b9;
x = (x ^ (x >> 27)) * 0x94d049bb133111eb;
return x ^ (x >> 31);
}
size_t operator()(uint64_t x) const {
static const uint64_t FIXED_RANDOM = chrono::steady_clock::now().time_since_epoch().count();
return splitmix64(x + FIXED_RANDOM);
}
};
#ifndef ONLINE_JUDGE
#define debug(x) cerr << #x << " " << x << endl;
#else
#define debug(x)
#endif
void _print(int t) {cerr << t;}
void _print(string t) {cerr << t;}
void _print(char t) {cerr << t;}
void _print(double t) {cerr << t;}
template <class T, class V> void _print(pair <T, V> p);
template <class T> void _print(vector <T> v);
template <class T> void _print(set <T> v);
template <class T, class V> void _print(map <T, V> v);
template <class T> void _print(multiset <T> v);
template <class T, class V> void _print(pair <T, V> p) {cerr << "{"; _print(p.ff); cerr << ","; _print(p.ss); cerr << "}";}
template <class T> void _print(vector <T> v) {cerr << "[ "; for (T i : v) {_print(i); cerr << " ";} cerr << "]";}
template <class T> void _print(set <T> v) {cerr << "[ "; for (T i : v) {_print(i); cerr << " ";} cerr << "]";}
template <class T> void _print(multiset <T> v) {cerr << "[ "; for (T i : v) {_print(i); cerr << " ";} cerr << "]";}
template <class T, class V> void _print(map <T, V> v) {cerr << "[ "; for (auto i : v) {_print(i); cerr << " ";} cerr << "]";}
template<class A,class B>ostream&operator<<(ostream&out,const pair<A,B>&a){return out<<"("<<a.first<<","<<a.second<<")";}
template<class A>ostream&operator<<(ostream&out,const vector<A>&a){for(const A &it:a)out<<it<<" ";return out;}
template<class A,class B>istream&operator>>(istream&in,pair<A,B>&a){return in>>a.first>>a.second;}
template<class A>istream&operator>>(istream&in,vector<A>&a){for(A &i:a)in>>i;return in;}
int gcd(int a,int b){
return (b==0) ? a : gcd(b,a%b);
}
int32_t main(){
fastio
//cout<<setprecision(6)<<fixed<<ans<<endl;//
//freopen( "input.txt" , "r" , stdin );//
//freopen( "output.txt" , "w" , stdout );//
// jaldi_karenge_jaldbaazi_nahi
int t=1;
// cin>>t;
while(t--){
string s;cin>>s;
int n = s.length();
char cur = s[0];
int count = 0;
vector<pair<char,int>> v;
fo(i,0,n-1){
if(cur==s[i]){
count++;
}
else{
v.pb({cur,count});
count = 1;
cur = s[i];
}
}
if(count){
v.pb({cur,count});
}
int sz = v.size();
vector<vector<int>> dp(sz+1,vector<int> (4,0));
dp[0][0] = 1;
fo(i,0,sz-1){
dp[i+1][0] = dp[i][0];
dp[i+1][1] = dp[i][1];
dp[i+1][2] = dp[i][2];
dp[i+1][3] = dp[i][3];
if(v[i].ff=='v'){
if(v[i].ss==1){
continue;
}
dp[i+1][3] += (dp[i][2]*(v[i].ss-1));
dp[i+1][1] += (dp[i][0]*(v[i].ss-1));
}
else{
dp[i+1][2] += (dp[i][1]*(v[i].ss));
}
}
// fo(i,0,sz){
// cout<<dp[i]<<endl;
// }
cout<<dp[sz][3]<<endl;
}
return 0;
}
180C - Letter | 151A - Soft Drinking |
1352A - Sum of Round Numbers | 281A - Word Capitalization |
1646A - Square Counting | 266A - Stones on the Table |
61A - Ultra-Fast Mathematician | 148A - Insomnia cure |
1650A - Deletions of Two Adjacent Letters | 1512A - Spy Detected |
282A - Bit++ | 69A - Young Physicist |
1651A - Playoff | 734A - Anton and Danik |
1300B - Assigning to Classes | 1647A - Madoka and Math Dad |
710A - King Moves | 1131A - Sea Battle |
118A - String Task | 236A - Boy or Girl |
271A - Beautiful Year | 520B - Two Buttons |
231A - Team | 479C - Exams |
1030A - In Search of an Easy Problem | 158A - Next Round |
71A - Way Too Long Words | 160A - Twins |
1A - Theatre Square | 1614B - Divan and a New Project |